﻿Imports BU
Imports DAL
Imports Infragistics.Win
Imports Infragistics.Win.UltraWinGrid

Public Class fQuotations

    Private rowGuidQuotation As Guid

    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu EmployeeIds + Name với cbxEmployeeId
    ''' </summary>
    Private Sub BindingListOfEmployeeIdsWithNameToComboBox()

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Employees")

        'Khai báo một biến đối tượng DataColumn
        Dim dcEmployee As New DataColumn("EmployeeID", GetType(Int32))

        'Thêm cột CustomerId vào DataTable
        dcEmployee.Caption = "ID"
        dtSource.Columns.Add(dcEmployee)

        'Thêm cột CompanyNameVI
        dcEmployee = New DataColumn("Name", GetType(String))
        dcEmployee.MaxLength = 512
        dcEmployee.Caption = "Nhân viên phụ trách"
        dtSource.Columns.Add(dcEmployee)

        'Khai báo một biến đối tượng DataRow
        Dim drEmployee As DataRow

        Dim obuEmployee As New buEmployees
        Dim listOfEmployeeIdsWithName As List(Of Employee) =
                obuEmployee.RetrieveEmployees()

        For Each oEmployee As Employee In listOfEmployeeIdsWithName
            drEmployee = dtSource.NewRow()
            drEmployee("EmployeeID") = oEmployee.EmployeeId
            drEmployee("Name") = oEmployee.Name
            dtSource.Rows.Add(drEmployee)
        Next


        'Liên kết với ComboBox Customers của Panel Contact
        cbxEmployeeId.DataSource = dtSource

        cbxEmployeeId.DisplayMember = "Name"
        cbxEmployeeId.ValueMember = "EmployeeID"

    End Sub


    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu CustomerIds + CompanyNameVI với cbxCustomerId
    ''' </summary>
    Private Sub BindingListOfCustomerIdsWithCompanyNameVIsToComboBox()

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Customers")

        'Khai báo một biến đối tượng DataColumn
        Dim dcCustomer As New DataColumn("CustomerID", GetType(Int32))

        'Thêm cột CustomerId vào DataTable
        dcCustomer.Caption = "ID"
        dtSource.Columns.Add(dcCustomer)

        'Thêm cột CompanyNameVI
        dcCustomer = New DataColumn("CompanyNameVI", GetType(String))
        dcCustomer.MaxLength = 512
        dcCustomer.Caption = "Tên khách hàng"
        dtSource.Columns.Add(dcCustomer)

        'Khai báo một biến đối tượng DataRow
        Dim drCustomer As DataRow

        Dim obuCustomer As New buCustomers
        Dim listOfCustomerIdsWithCompanyNameVI As List(Of Customer) =
                obuCustomer.RetrieveListOfCustomerIdsAndCompanyNameVIs()

        For Each customer As Customer In listOfCustomerIdsWithCompanyNameVI
            drCustomer = dtSource.NewRow()
            drCustomer("CustomerID") = customer.CustomerId
            drCustomer("CompanyNameVI") = customer.CustomerNameVI
            dtSource.Rows.Add(drCustomer)
        Next


        'Liên kết với ComboBox Customers của Panel Contact
        cbxCustomerId.DataSource = dtSource

        cbxCustomerId.DisplayMember = "CompanyNameVI"
        cbxCustomerId.ValueMember = "CustomerID"

    End Sub


    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu AddressIds + AddressDetails với cbxAddressId
    ''' </summary>
    Private Sub BindingListOfAddressIdsWithDetailsToComboBoxByCustomerId(ByVal customerId As Integer)

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Addresses")

        'Khai báo một biến đối tượng DataColumn
        Dim dcAddress As New DataColumn("AddressID", GetType(Int32))

        'Thêm cột CustomerId vào DataTable
        dcAddress.Caption = "ID"
        dtSource.Columns.Add(dcAddress)

        'Thêm cột CompanyNameVI
        dcAddress = New DataColumn("AddressDetails", GetType(String))
        dcAddress.MaxLength = 1024
        dcAddress.Caption = "Địa chỉ"
        dtSource.Columns.Add(dcAddress)

        'Khai báo một biến đối tượng DataRow
        Dim drAddress As DataRow

        Dim obuAddress As New buAddresses
        Dim listOfAddressIdsAndDetailsByCustomerId As List(Of Address) =
                obuAddress.RetrieveAddressesByCustomerId(customerId)


        For Each oAddress As Address In listOfAddressIdsAndDetailsByCustomerId
            drAddress = dtSource.NewRow()
            drAddress("AddressID") = oAddress.AddressId
            drAddress("AddressDetails") = oAddress.AddressDetails
            dtSource.Rows.Add(drAddress)
        Next


        'Liên kết với ComboBox Address của Panel Contact
        cbxAddressId.DataSource = dtSource
        cbxAddressId.DisplayMember = "AddressDetails"
        cbxAddressId.ValueMember = "AddressID"
    End Sub


    ''' <summary>
    '''     PROCEDURE - Liên kết dữ liệu ContactId + ContactDetails với cbxAddressId
    ''' </summary>
    Private Sub BindingListOfContactIdsWithDetailsToComboBoxByCustomerId(ByVal customerId As Integer)

        'Khai báo một DataTable để chứa dữ liệu
        Dim dtSource As New DataTable("Contacts")

        'Khai báo một biến đối tượng DataColumn
        Dim dcContact As New DataColumn("ContactID", GetType(Int32))

        'Thêm cột AddressId vào DataTable
        dcContact.Caption = "ID"
        dtSource.Columns.Add(dcContact)

        'Thêm cột ContactDetails
        dcContact = New DataColumn("ContactDetails", GetType(String))
        dcContact.MaxLength = 1024
        dcContact.Caption = "Người liên hệ"
        dtSource.Columns.Add(dcContact)

        'Khai báo một biến đối tượng DataRow
        Dim drContact As DataRow

        Dim obuContact As New buContacts
        Dim listOfContactIdsAndDetailsByCustomerId As List(Of Contact) =
                obuContact.RetrieveContactsByCustomerId(customerId)


        For Each oContact As Contact In listOfContactIdsAndDetailsByCustomerId
            drContact = dtSource.NewRow()
            drContact("ContactID") = oContact.ContactId
            drContact("ContactDetails") = oContact.ContactDetails
            dtSource.Rows.Add(drContact)
        Next


        'Liên kết với ComboBox Contact của Panel Contact
        cbxContactId.DataSource = dtSource
        cbxContactId.DisplayMember = "ContactDetails"
        cbxContactId.ValueMember = "ContactID"


    End Sub


    ''' <summary>
    ''' PROCEDURE - Liên kết DataTable về Quotations với Grid
    ''' </summary>
    ''' <param name="hasOrdered">True: Quotation đã nhận đặt hàng</param>
    Private Sub BindingListOfQuotationsToGrid(ByVal hasOrdered As Boolean)
        
        Dim obuQuotation As New buQuotations
        grdQuotations.DataSource = obuQuotation.TransferListOfQuotationsToDataTable(hasOrdered)

        'Ẩn các cột không cần thiết
        grdQuotations.DisplayLayout.Bands(0).Columns(1).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(2).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(3).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(4).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(5).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(6).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(7).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(8).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(9).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(10).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(11).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(12).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(15).Hidden = True
        grdQuotations.DisplayLayout.Bands(0).Columns(16).Hidden = True

    End Sub


    ''' <summary>
    '''     PROCEDURE - Truy vấn tất cả các phiên bản Price List có trong CSDL
    ''' </summary>
    Private Sub RetrievePriceListVersionForComboBox()

        Dim obuRAPriceList As New buRockwellAutomationPriceLists
        Dim listOfPriceListVersions As List(Of RockwellAutomationPriceList) = obuRAPriceList.RetrievePriceListVersions()

        For Each oPL As RockwellAutomationPriceList In listOfPriceListVersions
            cbxPriceListVersion.Items.Add(oPL.Version)
        Next

        'Chọn mặc định phiên bản giá mới nhất
        cbxPriceListVersion.SelectedIndex = cbxPriceListVersion.Items.Count - 1

    End Sub


    ''' <summary>
    ''' PROCEDURE - Ánh xạ dữ liệu đối tượng Quotation lên các Controls
    ''' </summary>
    ''' <param name="oQuotation">Đối tượng Quotation cần ánh xạ</param>
    Private Sub ReflectDataToControls(ByVal oQuotation As Quotation)

        cbxCustomerId.Value = oQuotation.CustomerId
        cbxAddressId.Value = oQuotation.AddressId
        cbxContactId.Value = oQuotation.ContactId

        cbxPriceType.Text = oQuotation.PriceType
        cbxPaymentTerm.Text = oQuotation.PaymentTerm
        nudCommission.Value = oQuotation.Commission

        cbxDeliveryTime.Text = oQuotation.DeliveryTime
        cbxWarrantyTime.Text = oQuotation.WarrantyTime
        cbxValidity.Text = oQuotation.Validity

        If Not String.IsNullOrWhiteSpace(oQuotation.Note) Then
            tbxNote.Text = oQuotation.Note
        Else
            tbxNote.Text = String.Empty
        End If

        dtpCreatedDate.Value = oQuotation.CreatedDate
        nudRevision.Value = oQuotation.Revision
        tbxQuotationId.Text = oQuotation.QuotationId
        cbxEmployeeId.Value = oQuotation.EmployeeId
        nudCurrencyRate.Value = oQuotation.CurrencyRate

        If Not String.IsNullOrWhiteSpace(oQuotation.SPRNumber) Then
            tbxSPRNumber.Text = oQuotation.SPRNumber
        Else
            tbxSPRNumber.Text = String.Empty
        End If

        chkHasOrdered.Checked = oQuotation.Ordered

        lblRowGuid.Text = oQuotation.RowGuid.ToString.ToUpper()

    End Sub


    ''' <summary>
    ''' FUNCTION - Chuyển một UltraGridRow thành đối tượng Quotation
    ''' </summary>
    ''' <param name="grQuotation">Đối tượng UltraGridRow chuyển đổi</param>
    Private Function ConvertARowOfQuotationGridToQuotationObject(ByVal grQuotation As UltraGridRow) As Quotation

        'FUNC: Phương pháp lấy dữ liệu của Selected Row trong UltraGrid
        Dim oQuotation As New Quotation

        oQuotation.CustomerId = grQuotation.Cells("CustomerID").Text
        oQuotation.AddressId = grQuotation.Cells("AddressID").Text
        oQuotation.ContactId = grQuotation.Cells("ContactID").Text
        oQuotation.PriceType = grQuotation.Cells("PriceType").Text
        oQuotation.PaymentTerm = grQuotation.Cells("PaymentTerm").Text
        oQuotation.Commission = grQuotation.Cells("Commission").Text
        oQuotation.DeliveryTime = grQuotation.Cells("DeliveryTime").Text
        oQuotation.WarrantyTime = grQuotation.Cells("WarrantyTime").Text
        oQuotation.Validity = grQuotation.Cells("Validity").Text
        oQuotation.Note = grQuotation.Cells("Note").Text
        oQuotation.CreatedDate = grQuotation.Cells("CreatedDate").Text
        oQuotation.Revision = grQuotation.Cells("Revision").Text
        oQuotation.QuotationId = grQuotation.Cells("QuotationId").Text
        oQuotation.EmployeeId = grQuotation.Cells("EmployeeID").Text
        oQuotation.CurrencyRate = grQuotation.Cells("CurrencyRate").Text
        oQuotation.SPRNumber = grQuotation.Cells("SPRNumber").Text
        oQuotation.Ordered = grQuotation.Cells("Ordered").Text
        oQuotation.RowGuid = grQuotation.Cells("RowGuid").Value

        rowGuidQuotation = grQuotation.Cells("RowGuid").Value

        Return oQuotation

    End Function

    
    ''' <summary>
    ''' EVENT - fQuotations_Load
    ''' </summary>
    Private Sub fQuotations_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'Liên kết DataSource cho cbxCustomerId
        Call BindingListOfCustomerIdsWithCompanyNameVIsToComboBox()

        'Liên kết DataSource cho cbxEmployeeId
        Call BindingListOfEmployeeIdsWithNameToComboBox()

        'Liên kết DataSource cho grdQuotations
        Call BindingListOfQuotationsToGrid(False)

        'Truy vấn tất cả các phiên bản Price List
        Call RetrievePriceListVersionForComboBox()

    End Sub


    ''' <summary>
    ''' EVENT - cbxCustomerId_ValueChanged
    ''' </summary>
    Private Sub cbxCustomerId_ValueChanged(sender As Object, e As EventArgs) Handles cbxCustomerId.ValueChanged

        'FUNC: Thao tác với IValueList của UltraCombo (Sự kiện ValueChanged)
        Dim vlCustomer As IValueList = cbxCustomerId

        If vlCustomer.SelectedItemIndex >= 0 Then

            'Dim text As String = vlCustomer.GetText(vlCustomer.SelectedItemIndex)
            Call BindingListOfAddressIdsWithDetailsToComboBoxByCustomerId(CInt(cbxCustomerId.Value))
            Call BindingListOfContactIdsWithDetailsToComboBoxByCustomerId(CInt(cbxCustomerId.Value))

        End If
    End Sub


    ''' <summary>
    ''' EVENT - grdQuotations_AfterSelectChange : Một Quotation được chọn trên Grid
    ''' </summary>
    Private Sub grdQuotations_AfterSelectChange(sender As Object, e As UltraWinGrid.AfterSelectChangeEventArgs) Handles grdQuotations.AfterSelectChange

        'Tránh trường hợp người dùng chọn Row sau đó chọn một Cell
        'để Edit sẽ bị tung ra một Exception
        If e.Type Is GetType(UltraGridCell) Or e.Type Is GetType(UltraGridColumn) Then
            Exit Sub
        End If

        'Phát sinh lỗi exception out of bound
        Try
            If e.Type Is GetType(UltraGridRow) Then
                Call ReflectDataToControls(ConvertARowOfQuotationGridToQuotationObject(grdQuotations.Selected.Rows(0)))
            End If
        Catch ex As Exception
            Exit Sub
        End Try

    End Sub


    ''' <summary>
    ''' EVENT - btnQuotationDetails_Click
    ''' </summary>
    Private Sub btnQuotationDetails_Click(sender As Object, e As EventArgs) Handles btnQuotationDetails.Click

        Dim formQuotationDetails As New fQuotationDetails(rowGuidQuotation, cbxContactId.Text, cbxCustomerId.Text, cbxAddressId.Text, cbxEmployeeId.Text, dtpCreatedDate.Value, tbxQuotationId.Text, nudRevision.Value, cbxPriceListVersion.Text, tbxSPRNumber.Text, nudCurrencyRate.Value)
        formQuotationDetails.ShowDialog()

    End Sub


    
End Class